package org.csu.softwaremetrics_demo.metric.lk;

/**
 * NOF（Number of Fields）度量类
 * 用于计算类中字段（成员变量）的数量
 * 继承自AST访问器，实现了Metric接口
 */

import org.csu.softwaremetrics_demo.entity.common.LKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.Result;
import org.csu.softwaremetrics_demo.metric.Metric;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;

public class NOF extends ASTVisitor implements Metric<LKMetricSingleClass> {

    // 字段计数器，用于记录类中的字段数量
    private int fields;

    /**
     * 访问字段声明节点
     * 每访问一个字段声明就增加计数
     *
     * @param node 字段声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(FieldDeclaration node) {
        fields++;
        return false;
    }

    /**
     * 执行NOF度量计算
     * 通过接受编译单元并访问其中的字段声明节点来计算字段数量
     *
     * @param cu           编译单元
     * @param singleMetric 存储度量结果的对象
     * @param result       包含所有度量结果的报告
     */
    @Override
    public void execute(CompilationUnit cu, LKMetricSingleClass singleMetric, Result result) {
        cu.accept(this);
    }

    /**
     * 设置NOF度量结果
     * 将计算得到的字段数量设置到度量对象中
     *
     * @param singleMetric 要设置结果的度量对象
     */
    @Override
    public void setSingleMetric(LKMetricSingleClass singleMetric) {
        singleMetric.setNof(fields);
    }
}
